#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
#include<stdbool.h>
#include"LContact.h"

//定义一个链表的结构体
//typedef int SLDataType;
typedef PeoInfo SLDataType;//换成通讯录信息的结构体类型
typedef struct SListNode
{
    SLDataType data;
    struct SListNode* next;
}SLNode;

//打印链表数据
void SLPrint (SLNode* phead);
//尾插
void SLPushBack (SLNode** pphead,SLDataType x);
//头插
void SLPushFront (SLNode** pphead,SLDataType x);
//尾删
void SLPopBack(SLNode** pphead);
//头删
void SLPopFront(SLNode** pphead);
//指定位置前插入
void SLInsert(SLNode** pphead,SLNode* pos,SLDataType x);
//指定位置后插入
void SLInsertAfter(SLNode* pos,SLDataType x);
//删除pos节点
void SLErase(SLNode** pphead,SLNode* pos);
//删除pos之后的一个节点
void SLEraseAfter(SLNode* pos);

//找节点(可以直接穿一级指针，但是为了保持借口一致性，这里也传二级指针)
SLNode* SLFind(SLNode** pphead,SLDataType x);

//链表的销毁
void SLDesTroy(SLNode** pphead);

//OJ 删除链表中所有值为 val 的节点，并返回新的头节点
SLNode* removeElements(SLNode* head, int val);
SLNode* removeElements2(SLNode** head, int val);
//OJ 反转链表
SLNode* reverseList(SLNode* head);
//OJ 合并两个有序链表
SLNode* mergeTwoLists(SLNode* list1, SLNode* list2);
SLNode* mergeTwoLists2(SLNode* list1, SLNode* list2);
//OJ 找出并返回链表的中间结点。如果有两个中间结点，则返回第二个中间结点。
SLNode* middleNode(SLNode* head);
//OJ 环形链表的约瑟夫问题
int ysf(int n,int m);
//OJ 分隔链表
SLNode* partition(SLNode* head, int x);